"""
一、、保留文本块语义完整性
1、语义分块
2、 句子级分块

二、 父文档检索器（提供丰富的上下文）

三、 从文档内容基于大模型反向生成QA对，存起来。

四、 元数据增强
#    retriever = vectorstore.as_retriever(
#        search_kwargs = {"filter":{"source":"technical_manual_v2.pdf"}}
#    )

五、图RAG(Graph RAG)
对于高度关联的知识体系（如产品依赖、组织架构、事件因果链），可构建知识图谱，将实体与关系显示建模。

六、查询扩展（查询后的结果可以使用RRF 来打分后融合得到结果在发给大模型）
让LLM 扮演“头脑风暴师” ，基于原始问题生成多个语义等价但表述不同的子查询，分别检索后合并结果
from langchain.retrievers import MultiQueryRetriever
multiquery_retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(),
    llm=llm
)
user_query = "如何通过修改问题来改进检索效果？“
retrieved_docs = multiquery_retriever.invoke(user_query)


七、当用户问题过于具体时，不容易找到数据，可以引导到模型抽象出更高层次的问题，一边获取更广泛的背景知识。下面是一个提示词样例。
step_back_prompt = ChatPromptTemplate.from_messages([
    (
        "user","请将以下具体问题抽象为一个更通用的‘后退一步’问题。\n"
        "例如：‘LCEL 和 asyncio 如何交互？’ -> 'LCEL 的异步机制是怎样的？'\n\n"
        "原始问题：{original_question}"
    )
])

八、假设性文档嵌入 （特别适用开放性问答，缺乏训练数据的场景）
-- 让LLM 根据用户的问题 生成一个假设性的理想答案。
-- 将该答案进行向量化。
-- 用这个假想答案 的向量去检索真是文档库。


九、混合搜索 融合语义和关键词
"""


